﻿
namespace SuperMarieApi.App.Controllers.Tool.Extensions
{
    using System;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Xml.Serialization;

    public static class ObjectExte
    {
        //public static T To<T>(this object obj)
        //{
        //    return Mapper.DynamicMap<T>(obj);
        //}

        public static T Clone<T>(this T realObject) // T 要序列化的对象  
        {
            using (Stream stream = new MemoryStream()) // 初始化一个 流对象  
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T)); //将要序列化的对象序列化到xml文档（Formatter）  
                serializer.Serialize(stream, realObject); //将序列后的对象写入到流中  
                stream.Seek(0, SeekOrigin.Begin);
                return (T)serializer.Deserialize(stream);// 反序列化得到新的对象  
            }
        }

        /// <summary>
        /// 将对象转换为Int32类型
        /// </summary>
        /// <param name="defValue">缺省值，如果需要转换对象为 null 类型或是不能转换的则返回缺省值</param>
        /// <param name="s">传入的字符串</param>
        /// <returns>转换后的Int32类型结果</returns>
        public static Int32 ToInt32(this object s, int defValue)
        {

            if (s != DBNull.Value && s != null)
            {
                // if (s.ToString().Length > 0 && s.ToString().Length <= 11 && Regex.IsMatch(s.ToString(), @"^((-[1-9])|([1-9]))\d*$"))//
                if (s.ToString().Length > 0 && s.ToString().Length <= 11 && Regex.IsMatch(s.ToString(), @"^[-]?[0-9]*$"))
                {
                    if ((s.ToString().Length < 10) || (s.ToString().Length == 10 && s.ToString()[0] == '1') || (s.ToString().Length == 11 && s.ToString()[0] == '-' && s.ToString()[1] == '1'))
                    {
                        //todo:npoi单元格报错 可以加类型判断 能Convert的才Convert.ToInt32 否则先tostring
                        return Convert.ToInt32(s);
                    }
                }
            }
            return defValue;
        }

        /// <summary>
        /// 转换为string类型 
        /// </summary>
        /// <param name="s">要转换的数据</param>
        /// <returns>s不为NULL或DBNULL时 返回s.ToString(),否则 返回空字符串</returns>
        public static string NToString(this object s)
        {
            if (s != null && s != DBNull.Value)
            {
                return s.ToString();
            }
            else
            {
                return "";
            }
        }


        /// <summary>
        /// 转换为Decimal类型 
        /// </summary>
        /// <param name="s">要转换的数据</param>
        /// <param name="defValue">默认值</param>
        /// <returns>s不为NULL或DBNULL时 返回Decimal,否则 返回0</returns>
        public static Decimal NToDecimal(this object s, decimal defValue)
        {
            if ((s == null))
            {
                return defValue;
            }
            decimal value = defValue;
            if (s != null && s != DBNull.Value)
            {
                bool isDecimal = Regex.IsMatch(s.ToString(), @"^([-]|[0-9])[0-9]*(\.\w*)?$");
                if (isDecimal)
                {
                    value = Convert.ToDecimal(s);
                }
            }
            else
            {
                return value;
            }
            return value;
        }
    }
}
